package baza;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class Konto {
String nrKonta;
String login;
String haslo;
Integer wlascicielKonta;
double stanKonta;
double maxDebet ;
char czyLimit ;
double limitWyplat;
String typKonta;
ArrayList<Transakcja> transakcjeKonta;

public Konto(){

}
// tworzenie konta - bez transakcji
public Konto(String nrKonta,
		String login,
		String haslo,
		int wlascicielKonta,
		double stanKonta,
		double maxDebet,
		char czyLimit,
		double limitWyplat,
		String typKonta){
	
	this.nrKonta=nrKonta;
	this.login=login;
	this.haslo=haslo;
	this.wlascicielKonta=wlascicielKonta;
	this.stanKonta=stanKonta;
	this.maxDebet=maxDebet;
	this.czyLimit=czyLimit;
	this.limitWyplat=limitWyplat;
	this.typKonta=typKonta;
	this.transakcjeKonta= new ArrayList<Transakcja>();
}



public void setLogin(String nowy){
	this.login=nowy;	
	
}
public void setHaslo(String nowy){
	this.haslo=nowy;	
	
}
public void setStanKonta(double nowy){
	this.stanKonta=nowy;	
	
}
public void setMaxDebet(double nowy){
	this.stanKonta=nowy;	
	
}
public void setCzyLimit(char nowy){
	this.czyLimit=nowy;	
}
public void setLimitWyplat(double nowy){
	this.limitWyplat=nowy;	
	
}

public boolean pobierzDaneKontaPoNr(String nrKonta) throws SQLException{	
	String nazwabazy="baza.db";
		
		try {
			Class.forName("org.sqlite.JDBC");
		} catch (ClassNotFoundException e) {
		
			e.printStackTrace();
			return false;
		}

	Connection polaczenie=null;
	try {
		polaczenie = DriverManager.getConnection("jdbc:sqlite:"+nazwabazy);
	} catch (SQLException e) {
		e.printStackTrace();
		return false;
	}
	 java.sql.Statement statement = null;
	try {
		statement = polaczenie.createStatement();
	} catch (SQLException e) {

		e.printStackTrace();
		return false;
	}
	 try {
		statement.setQueryTimeout(30);
	} catch (SQLException e) {

		e.printStackTrace();
		return false;
	}
	     
	ResultSet wynik = null;
	try {
		wynik = statement.executeQuery("select * from konta where nrKonta='"+nrKonta+"'");
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return false;
	}
	this.nrKonta=wynik.getString("nrKonta");
	this.login=wynik.getString("login");
	this.haslo=wynik.getString("haslo");
	this.wlascicielKonta=wynik.getInt("wlascicielKonta");
	this.stanKonta=wynik.getDouble("stanKonta");
	this.maxDebet=wynik.getDouble("maxDebet");
	this.czyLimit=wynik.getString("czyLimit").charAt(0);
	this.limitWyplat=wynik.getDouble("limitWyplat");
	this.typKonta=wynik.getString("typ");
	
	polaczenie.close();
	return true;
	}

public boolean pobierzDaneKontaPoLoginie(String login) throws SQLException{
	String nazwabazy="baza.db";
		
		try {
			Class.forName("org.sqlite.JDBC");
		} catch (ClassNotFoundException e) {
		
			e.printStackTrace();
			return false;
		}

	Connection polaczenie=null;
	try {
		polaczenie = DriverManager.getConnection("jdbc:sqlite:"+nazwabazy);
	} catch (SQLException e) {
		e.printStackTrace();
		return false;
	}
	 java.sql.Statement statement = null;
	try {
		statement = polaczenie.createStatement();
	} catch (SQLException e) {

		e.printStackTrace();
		return false;
	}
	 try {
		statement.setQueryTimeout(30);
	} catch (SQLException e) {

		e.printStackTrace();
		return false;
	}
	     
	ResultSet wynik = null;
	try {
		wynik = statement.executeQuery("select login from konta where login='"+this.login+"'");
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return false;
	}
	this.nrKonta=wynik.getString("nrKonta");
	this.login=wynik.getString("login");
	this.haslo=wynik.getString("haslo");
	this.wlascicielKonta=wynik.getInt("wlascicielKonta");
	this.stanKonta=wynik.getDouble("stanKonta");
	this.maxDebet=wynik.getDouble("maxDebet");
	this.czyLimit=wynik.getString("czyLimit").charAt(0);
	this.limitWyplat=wynik.getDouble("limitWyplat");
	this.typKonta=wynik.getString("typ");
	
	polaczenie.close();
	return true;
	}

public  boolean kontoDodajDoBazy() throws SQLException{
	try {
		Class.forName("org.sqlite.JDBC");
	} catch (ClassNotFoundException e) {
	
		e.printStackTrace();
		return false;
	}
	String nazwaBazy="baza.db";
	Connection polaczenie=null;
	try {
		polaczenie = DriverManager.getConnection("jdbc:sqlite:"+nazwaBazy);
	} catch (SQLException e) {
	
		e.printStackTrace();
		return false;
	}
    
	
	Statement dodajWpis = null;
	try {
		dodajWpis = polaczenie.createStatement();
	} catch (SQLException e) {
			e.printStackTrace();
			return false;
	}
	
	
	dodajWpis.executeUpdate("INSERT INTO konta VALUES " +
						"('"+this.nrKonta+"','"
						+this.login+"','"+this.haslo+"','"+ this.wlascicielKonta+ "','" +
						this.stanKonta + "','" + this.maxDebet + "','" + 
						this.czyLimit + "','" +  this.limitWyplat+
					 "','" + this.typKonta + "' );");
	
	polaczenie.close();
	return true;
	
	
}
public boolean kontoUsunZBazy(String nrKonta) throws SQLException{

	String nazwabazy="baza.db";
	
	try {
		Class.forName("org.sqlite.JDBC");
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return false;
	}
	
	Connection polaczenie=null;
	polaczenie = DriverManager.getConnection("jdbc:sqlite:"+nazwabazy);
	
	Statement usunWpis=polaczenie.createStatement();
	usunWpis.executeUpdate("DELETE FROM konta where nrKonta='"+nrKonta+"'");

	polaczenie.close();
	return true;
	
}
public boolean kontoZmienWBazie() throws SQLException{
	String nazwabazy="baza.db";
		
	try {
		Class.forName("org.sqlite.JDBC");
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return false;
	}

	Connection polaczenie=null;
	try {
		polaczenie = DriverManager.getConnection("jdbc:sqlite:"+nazwabazy);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return false;
	}

	Statement zmienWpis=polaczenie.createStatement();

	zmienWpis.executeUpdate("update konta set login='"+this.login +
			"',haslo='"+ this.haslo+
			"',wlascicielKonta='"+this.wlascicielKonta+
			"',stanKonta='"+this.stanKonta+
			"',maxDebet='"+this.maxDebet +
			"',czyLimit='"+this.czyLimit +
			"',limitWyplat='"+this.limitWyplat+
			"',typKonta='"+this.typKonta+
			"' where nrKonta='"+this.nrKonta+"'" );

	polaczenie.close();
	return true;
	
	}

public ArrayList<Transakcja> pokazTranzakcjeZDanegoKonta() throws SQLException{
	
		ArrayList<Transakcja> tranzakcjeKonta= new ArrayList<Transakcja>();
	String nazwabazy="baza.db";
		
		try {
			Class.forName("org.sqlite.JDBC");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	Connection polaczenie=null;
	try {
		polaczenie = DriverManager.getConnection("jdbc:sqlite:"+nazwabazy);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	 java.sql.Statement statement = null;
	try {
		statement = polaczenie.createStatement();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	 try {
		statement.setQueryTimeout(30);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	     
	ResultSet wynik = null;
	try {
		wynik = statement.executeQuery("select * from tranzakcje where kontoA="+this.nrKonta+";");
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	int i=0;
	
	while(wynik.next())
	{
	//Integer a= wynik.getInt("id");
	//System.out.println("id: "+a.toString());
	transakcjeKonta.add(new Transakcja(wynik.getInt("nrTranzakcji"),
			wynik.getString("kontoA"),wynik.getString("kontoB"),wynik.getDouble("kwota"),wynik.getDate("dataTranzakcji")));
	System.out.println( tranzakcjeKonta.get(i).toString());
	i++;
	}
	
	polaczenie.close();
	
	return tranzakcjeKonta;
}

public ArrayList<Transakcja> pokazTranzakcjeNaDaneKonto() throws SQLException{
	
		ArrayList<Transakcja> tranzakcjeKonta= new ArrayList<Transakcja>();
	String nazwabazy="baza.db";
		
		try {
			Class.forName("org.sqlite.JDBC");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	Connection polaczenie=null;
	try {
		polaczenie = DriverManager.getConnection("jdbc:sqlite:"+nazwabazy);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	 java.sql.Statement statement = null;
	try {
		statement = polaczenie.createStatement();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	 try {
		statement.setQueryTimeout(30);
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	     
	ResultSet wynik = null;
	try {
		wynik = statement.executeQuery("select * from tranzakcje where kontoB="+this.nrKonta+";");
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	int i=0;
	
	while(wynik.next())
	{
	//Integer a= wynik.getInt("id");
	//System.out.println("id: "+a.toString());
	tranzakcjeKonta.add(new Transakcja(wynik.getInt("nrTranzakcji"),
			wynik.getString("kontoA"),wynik.getString("kontoB"),wynik.getDouble("kwota"),wynik.getDate("dataTranzakcji")));
	System.out.println( tranzakcjeKonta.get(i).toString());
	i++;
	}

	polaczenie.close();
	
	return tranzakcjeKonta;
}
	public void  dodajTransakcje(Integer nrTransakcji,String kontoA,String kontoB,double kwota,Date dataTransakcji){
	// operacja pozwalajaza na dodanie tranzakcji do konta
		this.transakcjeKonta.add(new Transakcja (nrTransakcji, kontoA,kontoB, kwota,dataTransakcji));
	}
	
		public String toString(){
			
			return "Dane konta o nr = " + this.nrKonta + " "+ this.login+ 
			" "+this.haslo+ " "+this.wlascicielKonta + " "+this.stanKonta +" "+ this.maxDebet
			+ " "+this.czyLimit +" "+ this.limitWyplat +" "+ this.typKonta;
		}
}
